package controllers

import (
	"gitee.com/zhengjianfeng/pay/common"
	"gitee.com/zhengjianfeng/pay/models"
	"gitee.com/zhengjianfeng/pay/services"
	"gitee.com/zhengjianfeng/pay/web/middleware/jwts"
	"github.com/kataras/iris/v12"
	"regexp"
)

type AdminAgentController struct {
	Ctx               iris.Context
	PayAccountService services.PayAccountService
	PayAgentService   services.PayAgentService
}

// 添加代理
func (c *AdminAgentController) PostAgentCreate() {

	var (
		requestData     *PostCreateRequestData
		err             error
		isOk            bool
		agentId         int64
		userInfo        *models.PayAccount
		parentId        int64
		parentAgentRate int
	)

	// 获取请求信息 代理名称 账号密码 费率
	// 获取请求参数
	requestData = &PostCreateRequestData{}
	if err = common.GetRequestParams(c.Ctx, &requestData); err != nil {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, common.PARAMS_PARSE_FAIL.Error(), nil))
		return
	}

	// 验证参数
	if !(len(requestData.Nickname) > 1) {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, "昵称必须填写", nil))
		return
	}

	if isOk, _ = regexp.MatchString(`^['\w+]{5,15}$`, requestData.Username); !isOk {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, "登录账号必须是5-15位的有效字符串", nil))
		return
	}

	if isOk, _ = regexp.MatchString(`^['\w+]{6,15}$`, requestData.Password); !isOk {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, "登录密码必须是6-15位的有效字符串", nil))
		return
	}

	if requestData.AgentRate <= 0 || requestData.AgentRate > 10000 {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, "费率输入错误，只能在0.01%-100%之间", nil))
		return
	}

	// 检查用户名是否已经存在
	if userInfo = c.PayAccountService.GetOne(requestData.Username); userInfo.Id > 0 {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, "用户名已存在，请换一个用户名!", nil))
		return
	}

	// 如果角色类型是代理那么，上级ID为代理ID，否者上级ID为0（即该代理是管理员创建的）
	if jwts.BaseLoginInfo.RoleType == 2 {
		parentId = jwts.BaseLoginInfo.RelevantId

		// 如果是代理创建的代理，那么父代理的代理费率必须大于等于子代理的费率
		if parentAgentRate, err = c.PayAgentService.GetAgentRate(parentId); err != nil {
			_, _ = c.Ctx.JSON(common.GetResponseData(1, err.Error(), nil))
			return
		}

		if requestData.AgentRate > parentAgentRate {
			_, _ = c.Ctx.JSON(common.GetResponseData(1, "代理费率必须小于等于你自己代理的费率", nil))
			return
		}
	} else {
		parentId = 0
	}

	// 创建代理信息
	if agentId, err = c.PayAgentService.CreateAgent(requestData.Nickname, requestData.AgentRate, parentId); err != nil {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, err.Error(), nil))
		return
	}

	// 创建代理登录账号
	if _, err = c.PayAccountService.CreateAccount(requestData.Username, requestData.Nickname, requestData.Password, common.PAY_ROLE_TYPE_AGENT, agentId); err != nil {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, err.Error(), nil))
		return
	}

	_, _ = c.Ctx.JSON(common.GetResponseData(0, "success", nil))
	return
}

// 代理列表: TODO
func (c *AdminAgentController) PostAgentList() {
	// 检查权限是否有操作权限
	if !common.CheckIsAdmin(jwts.BaseLoginInfo.RoleType) {
		_, _ = c.Ctx.JSON(common.GetResponseData(1, common.AUTHORITY_NOT_EXIST.Error(), nil))
		return
	}

	// TODO
}
